package br.com.syswill.boaviagem.dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import br.com.syswill.boaviagem.domain.Gasto;
import br.com.syswill.boaviagem.domain.Viagem;

public class GastoDAO extends BoaViagemDAO {

	public static final String TABELA = "gasto";
	public static final String _ID = "_id";
	public static final String VIAGEM_ID = "viagem_id";
	public static final String CATEGORIA = "categoria";
	public static final String DATA = "data";
	public static final String DESCRICAO = "descricao";
	public static final String VALOR = "valor";
	public static final String LOCAL = "local";
	public static final String[] COLUNAS = new String[] { _ID, VIAGEM_ID,
			CATEGORIA, DATA, DESCRICAO, VALOR, LOCAL };

	public GastoDAO(Context context) {
		super(context);
	}

	public List<Gasto> listarGastos(Viagem viagem) {
		String selection = VIAGEM_ID + " = ?";
		String[] selectionArgs = new String[] { viagem.getId().toString() };
		Cursor cursor = getDb().query(TABELA, COLUNAS, selection,
				selectionArgs, null, null, null);
		List<Gasto> gastos = new ArrayList<Gasto>();
		while (cursor.moveToNext()) {
			Gasto gasto = criarGasto(cursor);
			gastos.add(gasto);
		}
		cursor.close();
		return gastos;
	}

	public Gasto buscarGastoPorId(Integer id) {
		Cursor cursor = getDb().query(TABELA, COLUNAS, _ID + " = ?",
				new String[] { id.toString() }, null, null, null);
		if (cursor.moveToNext()) {
			Gasto gasto = criarGasto(cursor);
			cursor.close();
			return gasto;
		}
		return null;
	}

	public long inserir(Gasto gasto) {
		return getDb().insert(TABELA, null, getContentValues(gasto));
	}

	public long atualizar(Gasto gasto) {
		return getDb().update(TABELA, getContentValues(gasto), _ID + " = ?",
				new String[] { gasto.getId().toString() });
	}

	public boolean removerGasto(Long id) {
		String whereClause = _ID + " = ?";
		String[] whereArgs = new String[] { id.toString() };
		int removidos = getDb().delete(TABELA, whereClause, whereArgs);
		return removidos > 0;
	}

	public boolean removerGastosViagem(Long id) {
		String whereClause = VIAGEM_ID + " = ?";
		String[] whereArgs = new String[] { id.toString() };
		int removidos = getDb().delete(TABELA, whereClause, whereArgs);
		return removidos > 0;
	}

	public double calcularTotalGasto(Viagem viagem) {
		Cursor cursor = getDb().rawQuery(
				"SELECT SUM(" + VALOR + ") FROM " + TABELA + " WHERE "
						+ VIAGEM_ID + " = ?",
				new String[] { viagem.getId().toString() });
		cursor.moveToFirst();
		double total = cursor.getDouble(0);
		cursor.close();
		return total;
	}

	private Gasto criarGasto(Cursor cursor) {
		Gasto gasto = new Gasto(cursor.getLong(cursor.getColumnIndex(_ID)),
				new Date(cursor.getLong(cursor.getColumnIndex(DATA))),
				cursor.getString(cursor.getColumnIndex(CATEGORIA)),
				cursor.getString(cursor.getColumnIndex(DESCRICAO)),
				cursor.getDouble(cursor.getColumnIndex(VALOR)),
				cursor.getString(cursor.getColumnIndex(LOCAL)),
				cursor.getLong(cursor.getColumnIndex(VIAGEM_ID)));
		return gasto;
	}

	public ContentValues getContentValues(Gasto gasto) {
		ContentValues values = new ContentValues();
		values.put(CATEGORIA, gasto.getCategoria());
		values.put(DATA, gasto.getData().getTime());
		values.put(DESCRICAO, gasto.getDescricao());
		values.put(LOCAL, gasto.getLocal());
		values.put(VALOR, gasto.getValor());
		values.put(VIAGEM_ID, gasto.getViagemId());

		return values;
	}

}
